package org.stock.agent.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.stereotype.Service;
import org.stock.agent.model.AnalysisResult;
import org.stock.agent.tools.StockTools;

@Service
@Slf4j
public class ValuationAnalyst {

    private final ChatClient openAiChatClient;
    private final ChatModel chatModel;
    private final StockTools stockTools;

    public ValuationAnalyst(ChatModel chatModel, StockTools stockTools) {

        this.chatModel = chatModel;
        this.stockTools = stockTools;

        // 构造时，可以设置 ChatClient 的参数
        // {@link org.springframework.ai.chat.client.ChatClient};
        this.openAiChatClient = ChatClient.builder(chatModel)
                // 实现 Chat Memory 的 Advisor
                // 在使用 Chat Memory 时，需要指定对话 ID，以便 Spring AI 处理上下文。
                .defaultAdvisors(
                        MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().build()).build()
                )
                // 实现 Logger 的 Advisor
                .defaultAdvisors(
                        new SimpleLoggerAdvisor()
                )
                // 设置 ChatClient 中 ChatModel 的 Options 参数
                .defaultOptions(
                        OpenAiChatOptions.builder()
                                .topP(0.7)
                                .build()
                )
                .build();
    }

    public AnalysisResult analyzeValuation(String symbol) {
        String prompt = """
            作为价值投资估值分析师，请全面深入分析{symbol}公司是否具有长期投资价值，特别关注其估值水平是否被低估。
            
            你需要使用以下工具获取相关信息进行分析：
            1. 使用getStockBasicInfo获取股票基础信息，包括公司名称、行业、上市日期等
            2. 使用getLatestTransaction获取最近的实时交易数据，获取当前股价、市值等市场数据
            3. 使用getBalanceSheet获取最近3年的资产负债表数据，分析资产质量、负债结构和股东权益
            4. 使用getIncomeStatement获取最近3年的利润表数据，分析营收、利润及其增长趋势
            5. 使用getCashFlowStatement获取最近3年的现金流量表数据，特别是自由现金流状况
            6. 使用getFinancialMainIndex获取最新的财务主要指标，包括各种估值相关指标
            7. 使用getCompanyCapital获取公司股本信息，计算市值相关数据
            8. 使用getCurrentTime获取当前时间，确保分析的时效性
            9. 使用getRecentDividends获取近年分红数据，分析公司分红历史和稳定性
            10. 使用getRecentOfferings获取近年增发数据，了解公司融资情况
            11. 使用getRestrictedStockUnlock获取解禁限售数据，分析解禁对股价的潜在影响
            12. 使用getQuarterlyProfit获取近一年各季度利润数据，分析盈利的季节性变化
            13. 使用getQuarterlyCashFlow获取近一年各季度现金流数据，分析现金流的季节性变化
            14. 使用getPerformanceForecast获取近年业绩预告数据，了解公司未来业绩预期
            15. 使用getFinancialIndicators获取财务指标数据，进行全面的财务分析
            
            请从以下几个维度进行深入分析：
            1. 绝对估值分析：
               - 市盈率(P/E)分析：当前PE、历史PE区间、PE百分位数，重点关注是否低于行业平均水平
               - 市净率(P/B)分析：当前PB、历史PB区间、PB百分位数，特别关注PB<1的情况
               - 市销率(P/S)分析：当前PS、与同行业对比
               - 企业价值倍数(EV/EBITDA)分析，判断是否适合价值投资
               - 股息率分析及其稳定性，高股息率通常代表价值投资属性
            
            2. 相对估值分析：
               - 与同行业公司的横向对比，寻找明显低估的股票
               - 与市场基准指数的对比
               - 与历史估值水平的纵向对比，识别历史低估区域
               - 估值在行业中的分位数位置，重点关注处于低位的股票
            
            3. 现金流估值分析：
               - 自由现金流(FCF)历史趋势分析，稳定正向现金流是价值投资的重要指标
               - FCFF和FCFE模型的适用性评估
               - 现金流质量评估（经营性现金流/净利润），寻找现金流健康的企业
               - 现金流与估值的匹配度分析，确保估值有现金流支撑
            
            4. 成长性与估值匹配分析：
               - PEG比率分析（PE/盈利增速），寻找PEG<1的价值股
               - 收入增长与估值的匹配度
               - 利润增长与估值的匹配度
               - 市场对未来成长性的定价是否合理，避免高估成长性
            
            5. 资产价值分析：
               - 账面价值与市场价值对比，寻找市值低于账面价值的股票
               - 重置成本分析
               - 无形资产价值评估
               - 资产质量对估值的影响，重点关注资产质量高的企业
            
            6. 宏观与市场环境分析：
               - 当前市场整体估值水平，寻找市场整体低估时的价值投资机会
               - 行业景气度对估值的影响
               - 宏观经济环境对估值的影响
               - 利率环境对估值的影响，低利率环境有利于价值股
            
            7. 风险调整估值分析：
               - 公司特定风险对估值的影响
               - 行业风险调整
               - 系统性风险考量
               - 估值的安全边际分析，重点评估下行风险
            
            结合以上分析，评估公司是否具有长期价值投资潜力（具有/不具有），
            并判断该股票是否被低估，适合作为长期价值投资标的，
            给出适合价值投资的可能性百分比（0-100）和详细的理由分析。
            
            特别注意：
            - 如果发现财务数据异常或不一致，请在分析中指出
            - 对比分析最近3年的估值数据变化趋势
            - 结合公司成长性和盈利能力综合评估估值合理性
            - 考虑周期性因素对估值指标的影响
            - 重点关注具有稳定盈利能力但被市场低估的公司
            
            请严格按照以下JSON格式返回结果：
            {
              "analystRole": "价值投资估值分析师",
              "symbol": "{symbol}",
              "probability": [0-100之间的数值，表示适合作为价值投资标的的概率，重点关注被低估且具有长期投资价值的股票],
              "reasoning": "[详细的估值分析理由，至少包含500字，涵盖上述分析维度，特别说明该股票是否适合长期价值投资]",
              "confidenceLevel": "[高/中/低，基于数据质量和分析确定性]"
            }
            """;

        AnalysisResult entity = openAiChatClient.prompt(prompt + "symbol是" + symbol)
                .tools(stockTools)
                .call()
                .entity(AnalysisResult.class);
        log.info("价值投资估值分析师: {}", entity.getReasoning());
        return entity;
    }
}